iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
Cloud Native

帶著MBP在異世界探險的科技宅系列 第 26

Docker Compose 啟動多個Image

  • 分享至 

  • xImage
  •  

接續昨天,因為我們有連接資料庫,因此我們其實需要一個Postgres的服務,這樣才能讓我的spring boot application 連接,除此之外,我還需要一個DB GUI來看確認我資料庫的情況,根據我使用的資料庫Postgres,可以使用pgadmin來掌握資料庫的情況。

根據以上,我需要啟動Spring boot Application、Postgres、pgadmin共計三個服務,那這樣一個一個起好像有點麻煩,有沒有有效率一點的方法呢?...有!就要講到今天的主角了-Docker Compose

Docker Compose 可以幫忙把要啟動的docker image 放在docker-compose.yml 檔案內,方便我們一次性的啟動,更好的事可以在裡面寫好配置,啟動多個服務就變得輕鬆多了~

下載

//可以先看有沒有下載
docker compose version

這邊付上官方下載教學,可以根據自己的os選擇。

server.json

前情提要一下,由於資料庫啟動後不會幫我創建出我需要的DataBase,我需要自己創建,因此我寫一個配置檔server.json,來透過pgadmin創建名為postgres的資料庫。內容如下

{
  "Servers": {
    "1": {
      "Name": "SPRINGBOOT APP",
      "Group": "Servers",
      "Host": "db",
      "Port": 5432,
      "MaintenanceDB": "postgres",
      "Username": "postgres",
      "Password": "postgres",
      "SSLMode": "prefer"
    }
  }
}

那我們來看看Docker Compose怎麼使用,先看我yml檔的其中一部分

docker-compose.yml

version: '3.8'

services:
  spring-boot-itdemo:
    container_name: 'spring-boot-itdemo'
    image: spring-boot-itdemo:latest
    ports:
      - "8080:8080"

version: 是指Docker Compose 配置文件根據版本 3.8 的語法和規則撰寫。
services: 是只需要啟動的服務,服務名稱可以自己取,如範例的spring-boot-itdemo。
接下來你可以對你的服務撰寫一些配置
container_name:很直觀,就是啟動後的container name
image:要啟動的image
ports:port號映射

其實要配置的還有很多,不過有許多都是根據使用的服務不同會有所改變,所以這邊不同的服務還是可以查詢一下要如何撰寫與配置喔,最後直接附上三個服務的docker-compose.yml完整內容

version: '3.8'

services:
  db:
    container_name: 'postgresql'
    image: postgres:15.2-alpine
    restart: always
    ports:
      - "5436:5432"
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    volumes:
      - db-data:/var/lib/postgresql/data

  dbGUI:
    container_name: 'pgadmin'
    image: dpage/pgadmin4
    restart: always
    ports:
      - "5437:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: 'test@gmail.com'
      PGADMIN_DEFAULT_PASSWORD: 'test'
      PGADMIN_SERVER_JSON_FILE: '/pgadmin4/pgadmin/server.json'
    volumes:
      - .\server.json:/pgadmin4/pgadmin/server.json
    depends_on:
      - db

  spring-boot-itdemo:
    container_name: 'spring-boot-itdemo'
    image: spring-boot-itdemo:latest
    restart: always
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/postgres
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: postgres
    depends_on:
      - db

這邊要提到一個觀念--掛載(volumes)

由於我們的存在Container內的資料會隨者Container 的生命週期結束一起消失不見,這是很可怕的事情,尤其當像我們有使用資料庫,如果服務不小心掛掉,那我們的資料也會跟不見,因此我們需要掛載。

其概念為將Container 內的資料夾,以上面的例子就是把儲存資料庫資料的資料夾,掛載到我本地的資夾,這樣Container掛掉後,我本地這邊就會有掛載出來的資料,資料就不會不見啦,同理如果本地有資料想帶入,也可以掛載進去,如我這邊將我的server.json掛載到/pgadmin4/pgadmin/server.json

以上寫完後回到docker-compose.yml的目錄下,使用


docker compose up

這樣就可以把包含在docker-compose.yml內的服務一次起動起來了喔~~


上一篇
Docker 打包專案與推上DockerHub
下一篇
Kubernetes(K8S)介紹
系列文
帶著MBP在異世界探險的科技宅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言